home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 1 / Cream of the Crop 1.iso / WINDOWS / PROFFT.ARJ / PICTWIN.CPP < prev    next >
C/C++ Source or Header  |  1992-04-29  |  7KB  |  228 lines

  1. /****************************************************************************
  2.     PICTWIN.CPP     Denne filen inneholder (i denne rekkef°lgen):
  3. *****************************************************************************
  4. void TPictureWindow::GetWindowClass(WNDCLASS& wc)
  5. LPSTR TPictureWindow::GetClassName()
  6. void TPictureWindow::PerformFFT()
  7. void TPictureWindow::Invert()
  8. BOOL PowerOf2(long l)
  9. void TPictureWindow::WMMDIActivate(RTMessage Msg)
  10. void TPictureWindow::SetMenuItems(WORD wStatus)
  11. ****************************************************************************/
  12.  
  13. #include <owl.h>
  14. #include <filedial.h>
  15. #include <dir.h>
  16. #include <string.h>
  17. #include <math.h>
  18.  
  19. #pragma hdrstop
  20. #include "profftid.h" // Symbolske konstanter
  21. #include "profft.h"   // Klassedefinisjoner
  22.  
  23. void TPictureWindow::GetWindowClass(WNDCLASS& wc)
  24. /****************************************************************************
  25. Henter vindusklassen og standardikon for vinduet.
  26.  
  27. Kodet av:   MK 28.04.92
  28. *****************************************************************************/
  29. {
  30.     TGenericPicWindow::GetWindowClass(wc);
  31.     wc.hIcon = LoadIcon(wc.hInstance, "BMP");
  32. }
  33.  
  34. LPSTR TPictureWindow::GetClassName()
  35. /****************************************************************************
  36. Returnerer vindusklassen.
  37.  
  38. Kodet av:   MK 28.04.92
  39. *****************************************************************************/
  40. {
  41.     return "PROfft:PictureWindow";
  42. }
  43.  
  44.  
  45. void TPictureWindow::PerformFFT()
  46. /****************************************************************************
  47. Denne rutinen klargj°r for FFT. Den starter med σ opprette et TComplexWindow
  48. objekt. Dette objektet fσr samme bildekarakteristikk som seg selv.
  49. Hvis det fσr opprettet det nye objektet, gir det objektet beskjed om σ
  50. regne ut fouriertransformen til seg selv.
  51.  
  52. Kodet av:   MK  01.04.92
  53. Modifisert:    MK  04.04.92  Div. vedlikehold, nye funksjoner for σ lette
  54.                                                     arbeidet med σ kopiere dataene.
  55. *****************************************************************************/
  56. {
  57.     WORD wSize;
  58.     HANDLE hComplex;
  59.     HANDLE hNewBitmap;
  60.     BITMAPINFO *bmpNewInfo;
  61.     HCURSOR hcrOld;
  62.     TComplexWindow *ComplexWindow;
  63.     int iY, iMaxY, n;
  64.     BOOL bFailed;
  65.  
  66.     bFailed = FALSE;
  67.     GlobalCompact(-1);  //  Rydd opp i minnet f°r vi fors°ker σ opprette
  68.                                             //  nye minneblokker til det nye objektet.
  69.  
  70.     //  Allokerer minne til det komplekse bildet (som da blir mange ganger
  71.     //  st°rre enn det orginale bildet pσ grunn av det komplekse flyttallet
  72.     //  som ligger i hvert enkelt punkt). MS_BUG taes med pσ grunn av
  73.     //  MicroSoft Windows sin bug nσr man allokerer blokker som gσr
  74.     //  n°yaktig opp i 64 K.
  75.     hComplex = GlobalAlloc(GMEM_PROFFTDATA,
  76.             bmpInfo->bmiHeader.biWidth*bmpInfo->bmiHeader.biHeight
  77.             *sizeof(prcomplex)+MS_BUG);
  78.     if (hComplex!=NULL)  //  Hvis det var plass i minnet
  79.     {
  80.         hcrOld = SetCursor(((TMainWindow *)Parent)->hcrWait);
  81.  
  82.         //  Opprett en kopi av bildestrukturdataene.
  83.         bmpNewInfo = MakeDuplicateBMPInfo(bmpInfo);
  84.         if (bmpNewInfo!=NULL)
  85.         {
  86.             //  Alloker minne til et ekstra bitmap bilde
  87.             hNewBitmap = GlobalAlloc(GMEM_PROFFTDATA,
  88.                     bmpNewInfo->bmiHeader.biSizeImage+MS_BUG);
  89.             if (hNewBitmap!=NULL)
  90.             {
  91.                 //  Kopierer fra den gamle bitmappen til den nye.
  92.                 //  Egentlig un°dvendig siden FFT representasjonen viser seg
  93.                 //  oppσ dette etterpσ, men det kan vµre greit σ se hvilket
  94.                 //  bilde det jobbes med.
  95.                 CopyBMP(hBitmap, hNewBitmap);
  96.  
  97.                 //  Opprett det nye TComplexWindow objektet.
  98.                 ((TComplexWindow *)(((TMainWindow *)Parent)->CreateComplexChild(FileName, hComplex,
  99.                             bmpNewInfo, hNewBitmap)))->PerformFFT();
  100.             }
  101.             else
  102.             {
  103.                 MessageBox(HWindow, "PerformFFT: Out of memory",
  104.                         ERROR_CAPTION, MB_ERROR);
  105.                 bFailed = TRUE;
  106.             }
  107.         }
  108.         else
  109.         {
  110.             MessageBox(HWindow, "TPictureWindow::PerformFFT bmpNewInfo==NULL",
  111.                     ERROR_CAPTION, MB_ERROR);
  112.             bFailed = TRUE;
  113.         }
  114.     }
  115.     else
  116.     {
  117.         MessageBox(HWindow, "PerformFFT: Out of memory",
  118.                 ERROR_CAPTION, MB_ERROR);
  119.         bFailed = TRUE;
  120.     }
  121.     if (bFailed)
  122.         GlobalFree(hComplex);
  123.     SetCursor(hcrOld);
  124. }
  125.  
  126. void TPictureWindow::Invert()
  127. /****************************************************************************
  128. Inverterer det aktuelle bildet. Ble brukt ved testing av rutinene for
  129. σ manipulere med verdiene i et bilde. Ble ikke fjernet da det kunne vµre
  130. greit σ ha..
  131.  
  132. Kodet av:   MK
  133. *****************************************************************************/
  134. {
  135.     int i, iX, iY, iW, iH, iMaxX, iNumColours, iMaxY;
  136.     BYTE bPixel;
  137.  
  138.     if (LockBMP())
  139.     {
  140.         iW = (int)bmpInfo->bmiHeader.biWidth;
  141.         iMaxX = iW - 1;
  142.         iH = (int)bmpInfo->bmiHeader.biHeight;
  143.         iMaxY = iH - 1;
  144.         for (iY=0;iY<=iMaxY;iY++)
  145.         {
  146.             for (iX=0;iX<=iMaxX;iX++)
  147.             {
  148.                 bPixel = GetBMPPixel(hBitmap, iX, iY, iW, iH);
  149.                 SetBMPPixel(hBitmap, iX, iY, iW, iH, (BYTE) (255 - bPixel));
  150.             }
  151.         }
  152.         UnlockBMP();
  153.         InvalidateRect(HWindow, NULL, FALSE);
  154.     }
  155.     else
  156.         MessageBox(HWindow, "TPictureWindow::Invert LockBMP() returned FALSE",
  157.                 ERROR_CAPTION, MB_ERROR);
  158. }
  159.  
  160. BOOL PowerOf2(long l)
  161. /****************************************************************************
  162. Sjekker om et tall er en toerpotens. Denne brukes for σ sjekke om
  163. brukeren har lastet inn et bilde som kan transformeres med FFT algoritmen.
  164.  
  165. Returnerer:        TRUE hvis toerpotens
  166.                             FALSE ellers.
  167. Kodet av:   MK
  168. *****************************************************************************/
  169. {
  170.     int i;
  171.     long lTemp;
  172.  
  173.     //  Gσr gjennom bit for bit. Hvis flere en ett bit er satt er ikke
  174.     //  tallet en ren toerpotens.
  175.     for (i=0;i<=15;i++)
  176.     {
  177.         lTemp = l & 1;
  178.         l = l>>1;
  179.         if ((lTemp!=0) && (l>0))
  180.             return FALSE;
  181.     }
  182.     return TRUE;
  183. }
  184.  
  185. void TPictureWindow::WMMDIActivate(RTMessage Msg)
  186. /****************************************************************************
  187. Denne kalles nσr bildet aktiveres. S°rger for σ sette de menyvalgene
  188. som er aktuelle for dette bildet (dvs. disabler IFFT, filtre o.l.).
  189.  
  190. RTMessage Msg        Sendes videre til superklassen.
  191.  
  192. Kodet av:   MK
  193. *****************************************************************************/
  194. {
  195.     TGenericPicWindow::WMMDIActivate(Msg);
  196.     if (Msg.WParam)
  197.         SetMenuItems(MF_ENABLED);  //  Hvis bildet aktiveres, muligj°r valg
  198.     else
  199.         SetMenuItems(MF_GRAYED);     //  Hvis ikke, umuliggj°r valgene
  200. }
  201.  
  202. void TPictureWindow::SetMenuItems(WORD wStatus)
  203. /****************************************************************************
  204. Setter de aktuelle valgene for dette objektet.
  205.  
  206. WORD wStatus        Inneholder hva valgene skal settes til (MF_ENABLED/MF_GRAYED)
  207.  
  208. Kodet av:   MK
  209. *****************************************************************************/
  210. {
  211.     HMENU hMenu;
  212.     int i;
  213.  
  214.     //  Hent en handle til menyen i hovedvinduet.
  215.     hMenu=GetMenu(((TMainWindow *)Parent)->HWindow);
  216.  
  217.     //  Hvis bildet er kvadratisk og en toerpotens, sett FFT valget.
  218.  
  219.     if (PowerOf2(bmpInfo->bmiHeader.biWidth))
  220.         if (bmpInfo->bmiHeader.biWidth==bmpInfo->bmiHeader.biHeight)
  221.             EnableMenuItem(hMenu, CM_TRANSFFT, wStatus);
  222.  
  223.     EnableMenuItem(hMenu, CM_TRANSINVERT, wStatus);
  224.     EnableMenuItem(hMenu, CM_EDITCOPY, wStatus);
  225.     EnableMenuItem(hMenu, CM_EDITCUT, wStatus);
  226.     EnableMenuItem(hMenu, CM_FILESAVEAS, wStatus);
  227. }
  228.